package com.yangwudi.controller;

import com.yangwudi.anno.LogOperation;
import com.yangwudi.pojo.Dept;
import com.yangwudi.pojo.Result;
import com.yangwudi.service.DeptService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Insert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;


//controller层 @RequestMapping 公共路径的抽取    只抽取公共部分路径，其他的需要补充
//一个完整的请求路径，应该是类上的@RequestMapping的value属性 + 方法上的@RequestMapping的value属性

@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {
//    用 @Slf4j 注解，会自动生成一个名为log的成员变量，类型为Logger
//    private static final Logger log = LoggerFactory.getLogger(DeptController.class);
    @Autowired
    private DeptService deptService;
//    @RequestMapping(value = "/depts",method = RequestMethod.GET) //methed: 指定请求方式

    /**
     * 查询部门列表
     */
    @GetMapping
    public Result list(){
//        System.out.println("查询全部部门数据");
        log.info("查询全部部门数据");
        List<Dept> deptList = deptService.findAll();
        return Result.success(deptList);

    }

//    /**
//     * 删除部门 方式一: 通过原始的HttpServletRequest对象获取参数
//     * 繁琐   手动类型转换
//     */
//    @DeleteMapping("/depts")
//    public Result delete(HttpServletRequest request) {
//        String idStr = request.getParameter("id");
//        int id = Integer.parseInt(idStr);
//        System.out.println("根据ID删除部门:" + id);
//        return Result.success();
//    }

//
//    /**
//     * 删除部门 方式二: 通过@RequestParam注解获取参数
//     * 注意事项: @RequestParam注解required属性: 默认为true,表示必须传递该参数,否则报错
//     *          如果参数可选，可以将required属性设置为false
//     */
//    @DeleteMapping("/depts")
////    public Result delete(@RequestParam("id") Integer deptId) {
//    public Result delete(@RequestParam(value = "id",required = false) Integer deptId) {
//        System.out.println("根据ID删除部门:" + deptId);
//        return Result.success();
//    }

    /**
     * 删除部门 方式三: 省略@RequestParam注解 (前端传递的秦桧参数名与后端服务器方法形参名一致时)（推荐!!!）
     */
    @LogOperation
    @DeleteMapping
    public Result delete(Integer id) {
//        System.out.println("根据ID删除部门:" + id);
        log.info("根据ID删除部门: {}" , id);
        deptService.deleteById(id);
        return Result.success();
    }

    /**
     * 新增部门
     */
    @LogOperation
    @PostMapping
    //@RequestBody  接受json格式的请求参数 --> 封装到对象  规则:JSON数据的键名与方法形参的对象的属性名称相同
    public Result add(@RequestBody  Dept dept){
//        System.out.println("新增部门:" + dept);
        log.info("新增部门: {}" , dept);
        deptService.add(dept);
        return Result.success();
    }

//    /**
//     * 修改部门 - 查询回显  根基ID查询部门信息
//     */
//    @GetMapping("/depts/{id}")
//    //路径参数: 通过请求URL直接传递参数，使用{...}来标识该路径参数，需要使用@PathVariable注解获取参数
//    public Result getInfo(@PathVariable ("id") Integer deptId){
//        System.out.println("根基ID查询部门信息:" + deptId);
//        return Result.success(deptId);
//    }


    /**
     * 修改部门 - 查询回显  根基ID查询部门信息
     */
    @GetMapping("/{id}")
    //路径参数名与形参名一致时，可以省略@PathVariable的value属性值
    public Result getInfo(@PathVariable Integer id){
//        System.out.println("根基ID查询部门信息:" + id);
        log.info("根基ID查询部门信息: {}" , id);
        Dept dept=deptService.getById(id);
        return Result.success(dept);
    }
    //如果URL中有多个路径参数，在方法形参中声明多个形参来接受路径就可以
    // 如:@GetMapping("/depts/{id}/{name}")
    //public Result getInfo(@PathVariable Integer id,@PathVariable String name){}


    /**
     * 修改部门
     */
    @LogOperation
    @PutMapping
    public Result update(@RequestBody Dept dept){
//        System.out.println("修改部门:" + dept);
        log.info("修改部门: {}" , dept);
        deptService.update(dept);
        return Result.success();
    }

}
